#include "grupoelementos.h"

GrupoElementos::GrupoElementos() : ElementoImpresion()
{

}

GrupoElementos::~GrupoElementos()
{
}

void GrupoElementos::destruirElementosAutodestruibles()
{
    foreach(ElementoImpresion* elemento, listaElementos) {
        if (elemento->esAutodestruible()) {
            delete elemento;
        }
    }
}

void GrupoElementos::imprimir(EstadoImpresion& estado, QRect rect)
{
    estado.getPainter()->setClipRect(rect);
    
    int anchoTotal = obtenerDimensiones(estado).width();
    int descensoTotal = obtenerDescenso(estado);
    int coordenadaXActual = estado.calcularXInicial(anchoTotal, rect);

    foreach(ElementoImpresion* elemento, listaElementos)
    {
        QSize tamanoElelemto = elemento->obtenerDimensiones(estado);
        int anchoElemento = tamanoElelemto.width();
        int altoElemento = tamanoElelemto.height();
        int descensoElemento = elemento->obtenerDescenso(estado);
        int coordenadaY = estado.calcularYInicial(altoElemento, descensoElemento, rect, descensoTotal);
        
        if (coordenadaXActual + anchoElemento > rect.right()) {
            anchoElemento = rect.right() - coordenadaXActual;
        }

        QRect rectElemento(coordenadaXActual, coordenadaY, anchoElemento, altoElemento);
        elemento->imprimir(estado, rectElemento);
        coordenadaXActual += elemento->obtenerDimensiones(estado).width();
    }
    
    estado.getPainter()->setClipping(false);
}

QSize GrupoElementos::obtenerDimensiones(EstadoImpresion& estado)
{
    int ancho = 0;
    int alto = 0;

    foreach (ElementoImpresion* elemento, listaElementos) {
        QSize sizeElemento = elemento->obtenerDimensiones(estado);

        ancho += sizeElemento.width();
        alto = alto > sizeElemento.height() ? alto : sizeElemento.height();
    }
    return QSize(ancho, alto);
}

int GrupoElementos::obtenerDescenso(EstadoImpresion& estado)
{
    int descensoMaximo = 0;
    foreach (ElementoImpresion* elemento, listaElementos) {
        int descensoElemento = elemento->obtenerDescenso(estado);
        descensoMaximo = descensoMaximo > descensoElemento ? descensoMaximo : descensoElemento;
    }
    return descensoMaximo;
}

void GrupoElementos::agregar(ElementoImpresion* elemento)
{
    listaElementos.append(elemento);
}

void GrupoElementos::agregar(const QList<ElementoImpresion*>& elementos)
{
    listaElementos.append(elementos);
}
